#define CountPin1 9
#define CountPin2 10

//------函数声明------//
void count1_interrupt();
void count2_interrupt();
void countdoor();

void init_countdoor()
{
    pinMode(CountPin1, INPUT_PULLUP);
    pinMode(CountPin2, INPUT_PULLUP);
    // 外部中断初始化
    attachInterrupt(digitalPinToInterrupt(CountPin1), count1_interrupt, FALLING); //计数器1中断  下降沿触发
    attachInterrupt(digitalPinToInterrupt(CountPin2), count2_interrupt, FALLING); //计数器2中断

    oled_print_single(0, 45, "countsenser init.");
    // Serial.println("countsenser init.");
    delay(600);
}

// 计数需增加变量寿命
// 外部中断的回调函数
void count1_interrupt()
{
    if (timestamp - Timeflag[0] > 3) // 反复触发中断， 判断时间间隔
    {
        Timeflag[0] = timestamp; //赋予时间戳
        countdoor();
    }
}
void count2_interrupt()
{
    if (timestamp - Timeflag[1] > 3)
    {
        Timeflag[1] = timestamp;
        countdoor();
    }
}

bool filter_door();
// 后期要将进出门信息写入tf卡中，得以断电保存
void countdoor()
{
    if (Timeflag[0] > 0 && Timeflag[1] > 0) // 两个门均有时间戳
    {                                       // 两个门被触发且触发间隔小于设定数值 则开始判断哪个门先触发
        if (filter_door())                  // 门滤波
        {
            if (Timeflag[0] < Timeflag[1]) // 出门  // 判断哪个门先触发
            {
                doorCount[1]++;
                // Serial.println("出 -- " + String(doorCount[0]));
                latestDoorStatus = "O";
            }
            else // 进门
            {
                doorCount[0]++;
                // Serial.println("进 -- " + String(doorCount[1]));
                latestDoorStatus = "I";
            }
            TimeClock = printDateTime(Rtc.GetDateTime()); // 蜜蜂进出,触发时间
            doorTouch = true;
        }
        Timeflag[0] = 0;
        Timeflag[1] = 0;
    }
}

// 将进出时间 和 进出状态写入tf卡中 方便后期时间段统计
// 写入tf卡不用扔在外部中断，尽快释放外部中断
// 写入tf卡的时候，需判断变量改变性，改变了则写入
// 写入时机定时器定

// 对中断触发次数进行计数，取时间戳均值，达到目标次数，才开始判断进出门

bool filter_door() // 门细致滤波  ? * 定时器周期  为最大触发间隔，超过最大间隔，清空时间戳
{
    // 1. 两时间戳绝对值差小于最大间隔  2. 两时间戳绝对值差大于最小间隔 3. 两时间戳不等 4. 时间戳1上次触发与当前时间戳1不等 5. 时间戳1前次触发与当前时间戳1差2以上
    if (labs(Timeflag[0] - Timeflag[1]) <= 10 && labs(Timeflag[0] - Timeflag[1]) >= 2 && Timeflag[0] != Timeflag[1] && labs(His_Time[0] - Timeflag[0]) > 5 && labs(His_Time[1] - Timeflag[1]) > 5 && labs(His_Time[0] - Timeflag[1]) > 5 && labs(His_Time[1] - Timeflag[0]) > 5)
    {
        // Serial.println("flag1: " + String(Timeflag[0]) + " flag2: " + String(Timeflag[1]) + " His_Time1: " + String(His_Time[0]) + " His_Time2: " + String(His_Time[1]) + " His_Time3: " + String(His_Time[2]) + " His_Time4: " + String(His_Time[3]));
        His_Time[0] = Timeflag[0]; // 当前时间戳1更新
        His_Time[1] = Timeflag[1]; // 当前时间戳2更新
        return true;
    }
    return false;
}